/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Usuario;

import java.awt.Color;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import clienteSandraParada.Login;
import clienteSandraParada.Mensajeria;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import java.awt.Point;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.GregorianCalendar;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.border.TitledBorder;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import service.UsuarioProfesional;

/**
 * El objetivo de esta clase es mostrar el formularioAdministracion con los
 * datos requeridos para registrar un Usuario en el Sistema.
 *
 * @author Franzel
 */
public class DialogoInfoUsuarioProfesional extends javax.swing.JDialog {

    private int filaClick = -1;
    private int columnaClick = -1;
    public HashMap<Point, Color> estados = new HashMap<Point, Color>();
    public ArrayList<Point> disponibilidad = new ArrayList<Point>();
    private Usuario usuario;
    private String nombreUsuarioAnterior;
    private String valorAnterior;

    /**
     * Constructor de la clase, recibe todos los parámetros e inicializa las
     * variables de la clase
     */
    public DialogoInfoUsuarioProfesional(java.awt.Frame parent, boolean modal, Usuario usuario) {
        super(parent, modal);
        initComponents();
        valorAnterior = "";
        setIconImage(new ImageIcon(getClass().getResource("/GUI/Img/logo2.png")).getImage());
        this.usuario = usuario;

        try {
            this.direccion.cargar();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        ColoredTableCellRenderer custom = new ColoredTableCellRenderer();
        this.tablaHorarioDisponible.setDefaultRenderer(Object.class, custom);

        this.setLocationRelativeTo(null);
        this.buttonGroup1.add(radioButomPorcentaje);
        this.buttonGroup1.add(radioButomArriendo);
        //   AutoCompleteDecorator.decorate(this.campoEspecialidad);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        botonFormularioAccion = new javax.swing.JButton();
        botonFormularioSalida = new javax.swing.JButton();
        panelInfoCuenta = new javax.swing.JPanel();
        jLabel16 = new javax.swing.JLabel();
        jLabel18 = new javax.swing.JLabel();
        campoUsuario = new javax.swing.JTextField();
        campoTipoCuenta = new javax.swing.JComboBox();
        jLabel20 = new javax.swing.JLabel();
        asterisco6 = new javax.swing.JLabel();
        asterisco7 = new javax.swing.JLabel();
        asterisco8 = new javax.swing.JLabel();
        campoContraseña = new javax.swing.JPasswordField();
        panelContacto = new javax.swing.JPanel();
        jLabel13 = new javax.swing.JLabel();
        jLabel14 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        campoTelefono = new componentes.Telefono();
        campoCelular = new componentes.Celular();
        campoEmail = new componentes.Correo();
        direccion = new componentes.Direccion();
        panelDatosPersonales = new javax.swing.JPanel();
        jLabel6 = new javax.swing.JLabel();
        campoApellidoPaterno = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        campoNombre = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        campoFechaNac = new com.toedter.calendar.JDateChooser();
        campoRut = new componentes.Rut();
        jLabel10 = new javax.swing.JLabel();
        campoApellidoMaterno = new javax.swing.JTextField();
        asterisco1 = new javax.swing.JLabel();
        asterisco2 = new javax.swing.JLabel();
        asterisco3 = new javax.swing.JLabel();
        asterisco4 = new javax.swing.JLabel();
        panelHorarioDisponible = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tablaHorarioDisponible = new javax.swing.JTable();
        jLabel23 = new javax.swing.JLabel();
        campoDuracion = new javax.swing.JComboBox();
        jLabel24 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        campoHoraInicio = new javax.swing.JComboBox();
        campoMinInicio = new javax.swing.JComboBox();
        campoHoraTermino = new javax.swing.JComboBox();
        campoMinTermino = new javax.swing.JComboBox();
        camposObligatorios = new javax.swing.JLabel();
        mensajesAdvertencia = new javax.swing.JLabel();
        unCampoObligatorio = new javax.swing.JLabel();
        panelInfoCuenta1 = new javax.swing.JPanel();
        jLabel25 = new javax.swing.JLabel();
        asterisco5 = new javax.swing.JLabel();
        tipoConvenio = new javax.swing.JLabel();
        campoPorcentaje = new javax.swing.JTextField();
        campoFonasa = new javax.swing.JCheckBox();
        campoIsapre = new javax.swing.JCheckBox();
        campoParticular = new javax.swing.JCheckBox();
        tipoAtencion = new javax.swing.JLabel();
        radioButomPorcentaje = new javax.swing.JRadioButton();
        radioButomArriendo = new javax.swing.JRadioButton();
        campoArriendo = new javax.swing.JTextField();
        jLabel29 = new javax.swing.JLabel();
        jLabel30 = new javax.swing.JLabel();
        campoEspecialidad = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        botonFormularioAccion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Agregar.png"))); // NOI18N
        botonFormularioAccion.setText("Agregar");
        botonFormularioAccion.setToolTipText("Agregar");
        botonFormularioAccion.setAlignmentY(0.0F);
        botonFormularioAccion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioAccionActionPerformed(evt);
            }
        });

        botonFormularioSalida.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Cancelar.png"))); // NOI18N
        botonFormularioSalida.setText("Cancelar");
        botonFormularioSalida.setToolTipText("Eliminar");
        botonFormularioSalida.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonFormularioSalidaActionPerformed(evt);
            }
        });

        panelInfoCuenta.setBorder(javax.swing.BorderFactory.createTitledBorder("Informacion de la cuenta"));
        panelInfoCuenta.setForeground(new java.awt.Color(102, 255, 51));

        jLabel16.setText("Tipo de cuenta:");

        jLabel18.setText("Nombre de usuario: ");

        campoTipoCuenta.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Profesional", "Secretaria", "Administrador" }));

        jLabel20.setText("Contraseña:");

        asterisco6.setText("*");

        asterisco7.setText("*");

        asterisco8.setText("*");

        javax.swing.GroupLayout panelInfoCuentaLayout = new javax.swing.GroupLayout(panelInfoCuenta);
        panelInfoCuenta.setLayout(panelInfoCuentaLayout);
        panelInfoCuentaLayout.setHorizontalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(jLabel20)
                        .addGap(42, 42, 42)
                        .addComponent(campoContraseña, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                                .addComponent(jLabel18)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelInfoCuentaLayout.createSequentialGroup()
                                .addComponent(jLabel16)
                                .addGap(27, 27, 27)))
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(campoUsuario)
                            .addComponent(campoTipoCuenta, 0, 155, Short.MAX_VALUE))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(asterisco6, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(asterisco8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(asterisco7, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(124, Short.MAX_VALUE))
        );
        panelInfoCuentaLayout.setVerticalGroup(
            panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuentaLayout.createSequentialGroup()
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(campoTipoCuenta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(jLabel18)
                            .addComponent(campoUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelInfoCuentaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(campoContraseña, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel20)
                            .addComponent(asterisco8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.CENTER, panelInfoCuentaLayout.createSequentialGroup()
                        .addComponent(asterisco6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(56, 56, 56)))
                .addContainerGap())
        );

        panelContacto.setBorder(javax.swing.BorderFactory.createTitledBorder("Contacto **"));
        panelContacto.setForeground(new java.awt.Color(102, 255, 51));

        jLabel13.setText("Teléfono:");

        jLabel14.setText("E-Mail:");

        jLabel15.setText("Celular:");

        javax.swing.GroupLayout panelContactoLayout = new javax.swing.GroupLayout(panelContacto);
        panelContacto.setLayout(panelContactoLayout);
        panelContactoLayout.setHorizontalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContactoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel15, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(campoCelular, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 97, Short.MAX_VALUE)
                        .addComponent(campoTelefono, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(118, Short.MAX_VALUE))
        );
        panelContactoLayout.setVerticalGroup(
            panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelContactoLayout.createSequentialGroup()
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoTelefono, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoCelular, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jLabel15))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addComponent(jLabel14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(24, 24, 24))
                    .addGroup(panelContactoLayout.createSequentialGroup()
                        .addComponent(campoEmail, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
        );

        panelDatosPersonales.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos personales"));
        panelDatosPersonales.setForeground(new java.awt.Color(102, 255, 51));

        jLabel6.setText("Rut:");

        jLabel7.setText("Apellido paterno:");

        jLabel8.setText("Nombres: ");

        jLabel9.setText("Fecha nacimiento:");

        jLabel10.setText("Apellido materno:");

        asterisco1.setText("*");

        asterisco2.setText("*");

        asterisco3.setText("*");

        asterisco4.setText("*");

        javax.swing.GroupLayout panelDatosPersonalesLayout = new javax.swing.GroupLayout(panelDatosPersonales);
        panelDatosPersonales.setLayout(panelDatosPersonalesLayout);
        panelDatosPersonalesLayout.setHorizontalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel6)
                        .addGap(71, 71, 71)
                        .addComponent(campoRut, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(asterisco1, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel10)
                            .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jLabel7, javax.swing.GroupLayout.Alignment.LEADING))
                            .addComponent(jLabel9))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(campoApellidoPaterno)
                            .addComponent(campoNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 163, Short.MAX_VALUE)
                            .addComponent(campoApellidoMaterno)
                            .addComponent(campoFechaNac, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(asterisco4, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(135, Short.MAX_VALUE))
        );
        panelDatosPersonalesLayout.setVerticalGroup(
            panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jLabel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(asterisco1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoRut, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDatosPersonalesLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoPaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(campoApellidoMaterno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(asterisco4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelDatosPersonalesLayout.createSequentialGroup()
                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(8, 8, 8)
                        .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDatosPersonalesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(campoFechaNac, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        panelHorarioDisponible.setBorder(javax.swing.BorderFactory.createTitledBorder("Horario disponible"));

        tablaHorarioDisponible.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"8:00", null, null, null, null, null, null, null},
                {"9:00", null, null, null, null, null, null, null},
                {"10:00", null, null, null, null, null, null, null},
                {"11:00", null, null, null, null, null, null, null},
                {"12:00", null, null, null, null, null, null, null},
                {"13:00", null, null, null, null, null, null, null},
                {"14:00", null, null, null, null, null, null, null},
                {"15:00", null, null, null, null, null, null, null},
                {"16:00", null, null, null, null, null, null, null},
                {"17:00", null, null, null, null, null, null, null},
                {"18:00", null, null, null, null, null, null, null},
                {"19:00", null, null, null, null, null, null, null}
            },
            new String [] {
                "Hora", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaHorarioDisponible.setRowSelectionAllowed(false);
        tablaHorarioDisponible.getTableHeader().setReorderingAllowed(false);
        tablaHorarioDisponible.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaHorarioDisponibleMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tablaHorarioDisponible);

        jLabel23.setText("Duración de bloques:");

        campoDuracion.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55", "60" }));
        campoDuracion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoDuracioncambiarBloque(evt);
            }
        });

        jLabel24.setText("min");

        jLabel4.setText("Hora inicio:");

        jLabel5.setText("Hora término:");

        campoHoraInicio.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
        campoHoraInicio.setSelectedIndex(7);
        campoHoraInicio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoHoraInicioActionPerformed(evt);
            }
        });

        campoMinInicio.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59" }));
        campoMinInicio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoMinInicioActionPerformed(evt);
            }
        });

        campoHoraTermino.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
        campoHoraTermino.setSelectedIndex(22);
        campoHoraTermino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoHoraTerminoActionPerformed(evt);
            }
        });

        campoMinTermino.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59" }));
        campoMinTermino.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoMinTerminoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelHorarioDisponibleLayout = new javax.swing.GroupLayout(panelHorarioDisponible);
        panelHorarioDisponible.setLayout(panelHorarioDisponibleLayout);
        panelHorarioDisponibleLayout.setHorizontalGroup(
            panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelHorarioDisponibleLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 472, Short.MAX_VALUE)
                    .addGroup(panelHorarioDisponibleLayout.createSequentialGroup()
                        .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelHorarioDisponibleLayout.createSequentialGroup()
                                .addComponent(jLabel23)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoDuracion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel24))
                            .addGroup(panelHorarioDisponibleLayout.createSequentialGroup()
                                .addComponent(jLabel4)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoMinInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(14, 14, 14)
                                .addComponent(jLabel5)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoHoraTermino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(campoMinTermino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(0, 171, Short.MAX_VALUE)))
                .addContainerGap())
        );
        panelHorarioDisponibleLayout.setVerticalGroup(
            panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelHorarioDisponibleLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel23)
                    .addComponent(jLabel24)
                    .addComponent(campoDuracion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(campoHoraTermino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(campoMinTermino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelHorarioDisponibleLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel4)
                        .addComponent(jLabel5)
                        .addComponent(campoHoraInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(campoMinInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 219, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        camposObligatorios.setText("* Campos obligatorios");

        mensajesAdvertencia.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        mensajesAdvertencia.setText("Área de mensajería");

        unCampoObligatorio.setText("** Al menos ingresar un campo");

        panelInfoCuenta1.setBorder(javax.swing.BorderFactory.createTitledBorder("Informacion del profesional"));
        panelInfoCuenta1.setForeground(new java.awt.Color(102, 255, 51));

        jLabel25.setText("Especialidad");

        asterisco5.setText("*");

        tipoConvenio.setText("Tipo de convenio con la clínica **");

        campoPorcentaje.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoPorcentajeActionPerformed(evt);
            }
        });

        campoFonasa.setText("FONASA");

        campoIsapre.setText("ISAPRE");

        campoParticular.setText("Particular");

        tipoAtencion.setText("Tipo de atención **");

        radioButomPorcentaje.setText("Porcentaje");
        radioButomPorcentaje.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioButomPorcentajeActionPerformed(evt);
            }
        });

        radioButomArriendo.setText("Arriendo");
        radioButomArriendo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioButomArriendoActionPerformed(evt);
            }
        });

        campoArriendo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoArriendoActionPerformed(evt);
            }
        });

        jLabel29.setText("%");

        jLabel30.setText("$");

        campoEspecialidad.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Seleccionar", "Medicina general", "Kinesiología", "Podología", "Psicología", "Psiquiatría", "Pediatría", "Medico cirujano", "Nutrición y dietética", "Psicopedagogía", "Terapeuta ocupacional", "Medicina alternativa", "Medicina biológica", "Medicina china" }));

        javax.swing.GroupLayout panelInfoCuenta1Layout = new javax.swing.GroupLayout(panelInfoCuenta1);
        panelInfoCuenta1.setLayout(panelInfoCuenta1Layout);
        panelInfoCuenta1Layout.setHorizontalGroup(
            panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuenta1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tipoAtencion)
                    .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(panelInfoCuenta1Layout.createSequentialGroup()
                            .addComponent(campoFonasa)
                            .addGap(18, 18, 18)
                            .addComponent(campoIsapre)
                            .addGap(18, 18, 18)
                            .addComponent(campoParticular))
                        .addGroup(panelInfoCuenta1Layout.createSequentialGroup()
                            .addComponent(jLabel25)
                            .addGap(28, 28, 28)
                            .addComponent(campoEspecialidad, javax.swing.GroupLayout.PREFERRED_SIZE, 181, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(asterisco5, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(24, 24, 24)))
                    .addComponent(tipoConvenio)
                    .addGroup(panelInfoCuenta1Layout.createSequentialGroup()
                        .addGap(82, 82, 82)
                        .addComponent(radioButomPorcentaje)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoPorcentaje, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel29)
                        .addGap(37, 37, 37)
                        .addComponent(radioButomArriendo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel30, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(campoArriendo, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(94, Short.MAX_VALUE))
        );
        panelInfoCuenta1Layout.setVerticalGroup(
            panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelInfoCuenta1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel25)
                    .addComponent(campoEspecialidad)
                    .addComponent(asterisco5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(27, 27, 27)
                .addComponent(tipoAtencion)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoIsapre)
                    .addComponent(campoParticular)
                    .addComponent(campoFonasa))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(tipoConvenio, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(radioButomArriendo, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(campoArriendo)
                        .addComponent(jLabel30))
                    .addGroup(panelInfoCuenta1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(radioButomPorcentaje, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel29, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(campoPorcentaje, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 940, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(botonFormularioAccion)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonFormularioSalida))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(unCampoObligatorio)
                            .addComponent(camposObligatorios)
                            .addComponent(panelContacto, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(panelDatosPersonales, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(direccion, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addComponent(panelInfoCuenta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(panelHorarioDisponible, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(panelInfoCuenta1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(panelDatosPersonales, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(direccion, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(1, 1, 1)
                        .addComponent(panelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panelInfoCuenta, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(panelInfoCuenta1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panelHorarioDisponible, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(camposObligatorios)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(unCampoObligatorio, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(4, 4, 4)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(botonFormularioAccion)
                    .addComponent(botonFormularioSalida))
                .addGap(16, 16, 16)
                .addComponent(mensajesAdvertencia, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public void agregarFocusListenerRut() {
        this.cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
        campoRut.getRut().addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
            }

            @Override
            public void focusLost(FocusEvent fe) {
                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    campoRut.getRut().requestFocus();
                } else {
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.Usuario u = (service.Usuario) cargarUsuario(campoRut.getRut().getText());
                    if (u != null) {
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                        campoRut.getRut().requestFocus();
                    }
                }
            }
        });
    }

    /**
     * Método Action Performed del boton de Accion en el
     * formularioAdministracion Usuario.
     *
     * @param variable de tipo ActionEvent con el evento del boton.
     *
     */
    private void botonFormularioAccionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioAccionActionPerformed

        java.util.List<service.Usuario> usuarios = this.listarUsuarios();
        boolean encontrado = false;
        //Revisa que un usuario creado no se repita
        if (validarCampos() && verificaHorarioProfesional()) {

            int fila = -1;
            if (this.getTitle().equals("Agregar Usuario")) {
                if (!campoRut.isValido()) {
                    cambiarEtiquetaMensajeria(Mensajeria.mensajeRutValido(), Color.red);
                    return;
                }

                for (service.Usuario u : usuarios) {
                    if (u.getRut().equals(campoRut.getRut().getText()) || u.getUsuario().equals(campoUsuario.getText())) {
                        encontrado = true;
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                        return;
                    }
                }

                if (encontrado == false) {
                    this.dispose();
                    service.Usuario u = new service.Usuario();
                    service.Privilegios p = new service.Privilegios();
                    p.setRutUsuario(campoRut.getRut().getText());
                    agregarPrivilegios(p);
                    u.setRut(campoRut.getRut().getText());
                    u.setTipoCuenta((String) campoTipoCuenta.getSelectedItem());
                    Privilegios privilegios = new Privilegios(null, true, null);
                    privilegios.setUsuario(u);
                    privilegios.privilegiosProfesional((String) campoEspecialidad.getSelectedItem());
                    privilegios.guardarPrivilegios();
                    //agrego usuario
                    cambiarEtiquetaMensajeria("Área de mensajería", Color.black);
                    service.Usuario us = crearObjetoUsuario(new service.Usuario());
                    agregarUsuario(us);
                    service.UsuarioProfesional usp = crearObjetoUsuarioProfesional(new service.UsuarioProfesional());
                    agregarUsuarioProfesional(usp);
                    //agrego horario
                    agregarHorarioProfesional();
                    //llamar bitacora
                    String valorNuevo = "Rut: " + us.getRut() + "\n" + "Nombres: " + us.getNombres() + "\n" + "Apellido Paterno: " + us.getApellidoPaterno() + "\n" + "Apellido Materno: " + us.getApellidoMaterno()
                            + "\n" + "Usuario: " + us.getUsuario() + "\n" + "Bloque: " + us.getBloque() + "\n" + "Calle: " + us.getCalle() + "\n" + "Celular: " + us.getCelular() + "\n" + "Comuna: " + us.getComuna() + "\n" + "Departamento: " + us.getDepto() + "\n" + "Email: " + us.getEmail()
                            + "\n" + "Fecha nacimiento: " + us.getFechaNac() + "\n" + "Número calle: " + us.getNumero() + "\n" + "Provincia: " + us.getProvincia()
                            + "\n" + "Región: " + us.getRegion() + "\n" + "Sector: " + us.getSector() + "\n" + "Teléfono: " + us.getTelefono() + "\n" + "Tipo cuenta: " + us.getTipoCuenta()
                            + "\n" + "Arriendo : " + usp.getArriendo() + "\n" + "Especialidad: " + usp.getEspecialidad() + "\n" + "Porcentaje: " + usp.getPorcentaje();
                    registrar(Login.getUser(), "Usuario", "Agregó usuario profesional", "No aplica", valorNuevo);
                    this.usuario.getjLabel5().setText(Mensajeria.mensajeDeAccion("Usuario", "agregar"));
                    fila = this.usuario.getContenedorUsuarios().getRowCount();
                    DefaultTableModel modelo = (DefaultTableModel) this.usuario.getContenedorUsuarios().getModel();
                    modelo.addRow(new String[4]);
                }
            } else if (this.getTitle().equals("Modificar Usuario") || this.getTitle().equals("Perfil de Usuario")) {
                encontrado = false;
                if (!nombreUsuarioAnterior.equals(campoUsuario.getText())) {
                    for (service.Usuario u : usuarios) {
                        if (u.getUsuario().equals(campoUsuario.getText())) {
                            encontrado = true;
                            cambiarEtiquetaMensajeria(Mensajeria.mensajeEntidadExistente("Usuario"), Color.red);
                            return;
                        }
                    }
                }
                if (!encontrado) {
                    this.dispose();
                    service.Usuario aux = (service.Usuario) cargarUsuario(campoRut.getRut().getText());
                    service.Usuario us = crearObjetoUsuario(aux);
                    service.UsuarioProfesional uspx = (service.UsuarioProfesional) cargarUsuarioProfesional(campoRut.getRut().getText());
                    service.UsuarioProfesional usp = crearObjetoUsuarioProfesional(uspx);

                    modificarUsuario(us);
                    modificarUsuarioProfesional(usp);
                    modificarHorarioProfesional();
                    String valorNuevo = "Rut: " + us.getRut() + "\n" + "Nombres: " + us.getNombres() + "\n" + "Apellido Paterno: " + us.getApellidoPaterno() + "\n" + "Apellido Materno: " + us.getApellidoMaterno()
                            + "\n" + "Usuario: " + us.getUsuario() + "\n" + "Bloque: " + us.getBloque() + "\n" + "Calle: " + us.getCalle() + "\n" + "Celular: " + us.getCelular() + "\n" + "Comuna: " + us.getComuna() + "\n" + "Departamento: " + us.getDepto() + "\n" + "Email: " + us.getEmail()
                            + "\n" + "Fecha nacimiento: " + us.getFechaNac() + "\n" + "Número calle: " + us.getNumero() + "\n" + "Provincia: " + us.getProvincia()
                            + "\n" + "Región: " + us.getRegion() + "\n" + "Sector: " + us.getSector() + "\n" + "Teléfono: " + us.getTelefono() + "\n" + "Tipo cuenta: " + us.getTipoCuenta()
                            + "\n" + "Arriendo : " + usp.getArriendo() + "\n" + "Especialidad: " + usp.getEspecialidad() + "\n" + "Porcentaje: " + usp.getPorcentaje();
                    registrar(Login.getUser(), "Usuario", "Modificó usuario profesional", valorAnterior, valorNuevo);
                    this.usuario.getjLabel5().setText(Mensajeria.mensajeDeAccion("Usuario", "modificar"));
                    fila = this.usuario.getContenedorUsuarios().getSelectedRow();
                }

            } else {
                this.dispose();
                service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
                if (p.isExportarUsuario()) {
                    fila = -1;
                    try {
                        exportarPDF();
                    } catch (DocumentException ex) {
                        Logger.getLogger(DialogoInfoUsuarioProfesional.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (FileNotFoundException ex) {
                        Logger.getLogger(DialogoInfoUsuarioProfesional.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
                }
            }

            if (fila != -1) {
                usuario.getContenedorUsuarios().setValueAt((String) this.campoTipoCuenta.getSelectedItem(), fila, 0);
                usuario.getContenedorUsuarios().setValueAt(this.campoRut.getRut().getText(), fila, 1);
                usuario.getContenedorUsuarios().setValueAt(this.campoUsuario.getText(), fila, 2);
                usuario.getContenedorUsuarios().setValueAt(this.campoEmail.getCorreo().getText(), fila, 3);
                usuario.getContenedorUsuarios().setValueAt(this.campoCelular.getCelular().getText(), fila, 4);
            }
        }

    }//GEN-LAST:event_botonFormularioAccionActionPerformed

    /**
     * Método Action Performed del boton de Salida en el
     * formularioAdministracion Usuario
     *
     * @param variable de tipo ActionEvent con el evento del boton
     *
     */
    private void botonFormularioSalidaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonFormularioSalidaActionPerformed
        // TODO add your handling code here:
        this.dispose();
}//GEN-LAST:event_botonFormularioSalidaActionPerformed

    /**
     * Método Action Performed de la tabla que almacena los horarios disponibles
     * de un Usuario.
     *
     * @param variable de tipo MouseEvent con el evento del mouse en la tabla
     *
     */
    private void tablaHorarioDisponibleMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaHorarioDisponibleMouseClicked
        // TODO add your handling code here:
        filaClick = this.tablaHorarioDisponible.getSelectedRow();
        columnaClick = this.tablaHorarioDisponible.getSelectedColumn();
        Point point = new Point(filaClick, columnaClick);
        if (estados.get(point) == null || estados.get(point) == Color.white) {
            estados.put(point, new Color(51, 153, 255));
            disponibilidad.add(point);

        } else {
            estados.remove(point);
            estados.put(point, Color.white);
            for (int i = 0; i < disponibilidad.size(); i++) {
                if (disponibilidad.get(i).equals(point)) {
                    disponibilidad.remove(i);
                    break;
                }
            }
        }

        this.tablaHorarioDisponible.repaint();
}//GEN-LAST:event_tablaHorarioDisponibleMouseClicked

    private void campoDuracioncambiarBloque(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoDuracioncambiarBloque
        if (verificaHorarioProfesional()) {
            actualizarTablaDisponibilidad();
        }
    }//GEN-LAST:event_campoDuracioncambiarBloque

    private void campoHoraInicioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoHoraInicioActionPerformed
        if (verificaHorarioProfesional()) {
            actualizarTablaDisponibilidad();
        }
    }//GEN-LAST:event_campoHoraInicioActionPerformed

    private void campoMinInicioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoMinInicioActionPerformed
        if (verificaHorarioProfesional()) {
            actualizarTablaDisponibilidad();
        }
    }//GEN-LAST:event_campoMinInicioActionPerformed

    private void campoHoraTerminoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoHoraTerminoActionPerformed
        if (verificaHorarioProfesional()) {
            actualizarTablaDisponibilidad();
        }
    }//GEN-LAST:event_campoHoraTerminoActionPerformed

    private void campoMinTerminoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoMinTerminoActionPerformed
        if (verificaHorarioProfesional()) {
            actualizarTablaDisponibilidad();
        }
    }//GEN-LAST:event_campoMinTerminoActionPerformed

    private void campoPorcentajeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoPorcentajeActionPerformed
        // TODO add your handling code here:
        if (!campoPorcentaje.getText().equals("")) {
            radioButomPorcentaje.setSelected(true);
        }
    }//GEN-LAST:event_campoPorcentajeActionPerformed

    private void campoArriendoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoArriendoActionPerformed
        // TODO add your handling code here:
        if (!campoArriendo.getText().equals("")) {
            radioButomArriendo.setSelected(true);
        }
    }//GEN-LAST:event_campoArriendoActionPerformed

    private void radioButomArriendoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButomArriendoActionPerformed

        // TODO add your handling code here:
        if(radioButomArriendo.isSelected()){
            this.campoArriendo.setEnabled(true);
            this.campoPorcentaje.setEnabled(false);
        }
    }//GEN-LAST:event_radioButomArriendoActionPerformed

    private void radioButomPorcentajeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioButomPorcentajeActionPerformed

        // TODO add your handling code here:
        if(radioButomPorcentaje.isSelected()){
            this.campoPorcentaje.setEnabled(true);
            this.campoArriendo.setEnabled(false);
        }
    }//GEN-LAST:event_radioButomPorcentajeActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel asterisco1;
    private javax.swing.JLabel asterisco2;
    private javax.swing.JLabel asterisco3;
    private javax.swing.JLabel asterisco4;
    private javax.swing.JLabel asterisco5;
    private javax.swing.JLabel asterisco6;
    private javax.swing.JLabel asterisco7;
    private javax.swing.JLabel asterisco8;
    public javax.swing.JButton botonFormularioAccion;
    public javax.swing.JButton botonFormularioSalida;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JTextField campoApellidoMaterno;
    private javax.swing.JTextField campoApellidoPaterno;
    public javax.swing.JTextField campoArriendo;
    private componentes.Celular campoCelular;
    private javax.swing.JPasswordField campoContraseña;
    public static javax.swing.JComboBox campoDuracion;
    private componentes.Correo campoEmail;
    private javax.swing.JComboBox campoEspecialidad;
    private com.toedter.calendar.JDateChooser campoFechaNac;
    private javax.swing.JCheckBox campoFonasa;
    private javax.swing.JComboBox campoHoraInicio;
    private javax.swing.JComboBox campoHoraTermino;
    private javax.swing.JCheckBox campoIsapre;
    private javax.swing.JComboBox campoMinInicio;
    private javax.swing.JComboBox campoMinTermino;
    private javax.swing.JTextField campoNombre;
    private javax.swing.JCheckBox campoParticular;
    public javax.swing.JTextField campoPorcentaje;
    public componentes.Rut campoRut;
    private componentes.Telefono campoTelefono;
    public javax.swing.JComboBox campoTipoCuenta;
    private javax.swing.JTextField campoUsuario;
    private javax.swing.JLabel camposObligatorios;
    private componentes.Direccion direccion;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel18;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel23;
    private javax.swing.JLabel jLabel24;
    private javax.swing.JLabel jLabel25;
    private javax.swing.JLabel jLabel29;
    private javax.swing.JLabel jLabel30;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel mensajesAdvertencia;
    private javax.swing.JPanel panelContacto;
    private javax.swing.JPanel panelDatosPersonales;
    private javax.swing.JPanel panelHorarioDisponible;
    private javax.swing.JPanel panelInfoCuenta;
    private javax.swing.JPanel panelInfoCuenta1;
    public javax.swing.JRadioButton radioButomArriendo;
    public javax.swing.JRadioButton radioButomPorcentaje;
    private javax.swing.JTable tablaHorarioDisponible;
    private javax.swing.JLabel tipoAtencion;
    private javax.swing.JLabel tipoConvenio;
    private javax.swing.JLabel unCampoObligatorio;
    // End of variables declaration//GEN-END:variables

    public void camposObligatoriosVisibles(boolean opcion) {
        this.asterisco1.setVisible(opcion);
        this.asterisco2.setVisible(opcion);
        this.asterisco3.setVisible(opcion);
        this.asterisco4.setVisible(opcion);
        this.asterisco5.setVisible(opcion);
        this.asterisco6.setVisible(opcion);
        this.asterisco7.setVisible(opcion);
        this.asterisco8.setVisible(opcion);
        this.camposObligatorios.setVisible(opcion);
        this.unCampoObligatorio.setVisible(opcion);
        this.mensajesAdvertencia.setVisible(opcion);

        if (opcion) {
            this.panelContacto.setBorder(new TitledBorder("Contacto **"));
            this.tipoAtencion.setText("Tipo de atención **");
            this.tipoConvenio.setText("Tipo de convenio con la clínica**");
            this.setSize(968, 700);
        } else {
            this.setSize(974, 635);
            this.tipoAtencion.setText("Tipo de atención");
            this.tipoConvenio.setText("Tipo de convenio con la clínica");
            this.panelContacto.setBorder(new TitledBorder("Contacto"));
        }
    }

    public void agregarHorarioProfesional() {

        try {
            Gson gson2 = new Gson();
            String json = gson2.toJson(disponibilidad);
            service.HorarioProfesional h = new service.HorarioProfesional();
            h.setRut(campoRut.getRut().getText());
            h.setDisponibilidad(json);
            h.setDuracionBloque(Integer.parseInt((String) campoDuracion.getSelectedItem()));
            h.setHoraInicio((String) campoHoraInicio.getSelectedItem());
            h.setMinInicio((String) campoMinInicio.getSelectedItem());
            h.setHoraTermino((String) campoHoraTermino.getSelectedItem());
            h.setMinTermino((String) campoMinTermino.getSelectedItem());
            GregorianCalendar c = new GregorianCalendar();
            c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/1900"));
            XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
            h.setFechaInicio(calendar);
            c.setTime(new SimpleDateFormat("dd/MM/yyyy").parse("01/01/3000"));
            calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
            h.setFechaTermino(calendar);
            agregarHorario(h);
        } catch (DatatypeConfigurationException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void modificarHorarioProfesional() {
        try {
            GregorianCalendar c = new GregorianCalendar();
            c.setTime(Calendar.getInstance().getTime());
            XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
            service.HorarioProfesional h = (service.HorarioProfesional) cargarHorarioSegunFecha(calendar, campoRut.getRut().getText());

            Gson gson2 = new Gson();
            String json = gson2.toJson(disponibilidad);
            System.out.println(json);
            System.out.println(h.getDisponibilidad());

            System.out.println(h.getDisponibilidad().equals(json));
            System.out.println(h.getDuracionBloque() == Integer.parseInt((String) campoDuracion.getSelectedItem()));

            if (!(h.getDisponibilidad().equals(json) && h.getDuracionBloque() == Integer.parseInt((String) campoDuracion.getSelectedItem())
                    && h.getHoraInicio().equals((String) campoHoraInicio.getSelectedItem())
                    && h.getMinInicio().equals((String) campoMinInicio.getSelectedItem())
                    && h.getHoraTermino().equals((String) campoHoraTermino.getSelectedItem())
                    && h.getMinTermino().equals((String) campoMinTermino.getSelectedItem()))) {
                System.out.println("Pase porq se modifico duracion de bloque o disponibilidad");
                int dias = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
                Calendar date = new GregorianCalendar();
                date.setTime(Calendar.getInstance().getTime());
                date.add(Calendar.DAY_OF_MONTH, -dias + 2);
                int dia = date.get(Calendar.DAY_OF_MONTH);
                int mes = date.get(Calendar.MONTH) + 1;
                int anio = date.get(Calendar.YEAR);
                System.out.println("date del lunes " + date.getTime());
                System.out.println("h dia " + h.getFechaInicio().getDay() + "\n h mes " + h.getFechaInicio().getMonth() + "\n h año" + h.getFechaInicio().getYear());
                System.out.println("dia " + dia + "\n mes" + mes + "\n año" + anio);
                if (h.getFechaInicio().getDay() == dia && h.getFechaInicio().getMonth() == mes
                        && h.getFechaInicio().getYear() == anio) {
                    System.out.println("entro porque estoy modificando la misma semana");
                    h.setDuracionBloque(Integer.parseInt((String) campoDuracion.getSelectedItem()));
                    h.setDisponibilidad(json);
                    h.setHoraInicio((String) campoHoraInicio.getSelectedItem());
                    h.setMinInicio((String) campoMinInicio.getSelectedItem());
                    h.setHoraTermino((String) campoHoraTermino.getSelectedItem());
                    h.setMinTermino((String) campoMinTermino.getSelectedItem());
                    modificarHorario(h);
                } else {
                    System.out.println("entro porque estoy agregando un nuevo horario");
                    service.HorarioProfesional h2 = new service.HorarioProfesional();
                    h2.setRut(campoRut.getRut().getText());
                    h2.setDisponibilidad(json);
                    h2.setDuracionBloque(Integer.parseInt((String) campoDuracion.getSelectedItem()));
                    h2.setHoraInicio((String) campoHoraInicio.getSelectedItem());
                    h2.setMinInicio((String) campoMinInicio.getSelectedItem());
                    h2.setHoraTermino((String) campoHoraTermino.getSelectedItem());
                    h2.setMinTermino((String) campoMinTermino.getSelectedItem());
                    c.setTime(date.getTime());
                    calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
                    h2.setFechaInicio(calendar);
                    System.out.println("fecha de inicio de h2: " + calendar.toString());
                    h2.setFechaTermino(h.getFechaTermino());
                    System.out.println("fecha de termino de h2: " + h.getFechaTermino().toString());
                    date.add(Calendar.DAY_OF_MONTH, -1);
                    c.setTime(date.getTime());
                    calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
                    h.setFechaTermino(calendar);
                    System.out.println("fecha de termino de h: " + calendar.toString());
                    agregarHorario(h2);
                    modificarHorario(h);
                }

            }
        } catch (DatatypeConfigurationException ex) {
            Logger.getLogger(DialogoInfoUsuarioProfesional.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean verificaHorarioProfesional() {
        if (!(Integer.parseInt((String) campoHoraInicio.getSelectedItem()) < Integer.parseInt((String) campoHoraTermino.getSelectedItem())
                || (Integer.parseInt((String) campoHoraInicio.getSelectedItem()) == Integer.parseInt((String) campoHoraTermino.getSelectedItem())
                && Integer.parseInt((String) campoMinInicio.getSelectedItem()) < Integer.parseInt((String) campoMinTermino.getSelectedItem())))) {
            cambiarEtiquetaMensajeria("La hora de inicio debe ser menor a la de termino", Color.red);
            return false;
        }
        int horas = Integer.parseInt((String) campoHoraTermino.getSelectedItem()) - Integer.parseInt((String) campoHoraInicio.getSelectedItem());
        //if(horas)
        //int minutos = 
        //if(){

        //}
        return true;



    }

    private void actualizarTablaDisponibilidad() {
        int inicioHora = Integer.parseInt((String) campoHoraInicio.getSelectedItem()), inicioMin = Integer.parseInt((String) campoMinInicio.getSelectedItem()), terminoHora = Integer.parseInt((String) campoHoraTermino.getSelectedItem()), terminoMin = Integer.parseInt((String) campoMinTermino.getSelectedItem());
        int bloquesTotal = ((terminoHora - inicioHora) * 60 + (terminoMin - inicioMin)) / Integer.parseInt((String) this.campoDuracion.getSelectedItem());
        Object[] o = new Object[8];
        DefaultTableModel model = new DefaultTableModel();
        model.addColumn("Hora");
        model.addColumn("Lunes");
        model.addColumn("Martes");
        model.addColumn("Miercoles");
        model.addColumn("Jueves");
        model.addColumn("Viernes");
        model.addColumn("Sabado");
        model.addColumn("Domingo");

        for (int i = 0; i < bloquesTotal; i++) {
            String hora = "", min = "";
            if (inicioHora < 10) {
                hora = "0" + inicioHora;
            } else {
                hora = "" + inicioHora;
            }
            if (inicioMin < 10) {
                min = "0" + inicioMin;
            } else {
                min = "" + inicioMin;
            }

            o[0] = hora + ":" + min;
            o[1] = "";
            o[2] = "";
            o[3] = "";
            o[4] = "";
            o[5] = "";
            o[6] = "";
            o[7] = "";

            model.addRow(o);
            if (inicioMin < 60) {
                inicioMin += Integer.parseInt((String) this.campoDuracion.getSelectedItem());
            }
            if (inicioMin == 60) {
                inicioMin = 0;
                inicioHora += 1;
            }
            if (inicioMin > 60) {
                inicioMin = inicioMin - 60;
                inicioHora += 1;
            }
        }
        this.tablaHorarioDisponible.setModel(model);
    }

    /**
     * Método que deja en blanco todos los campos del diálogo
     * formularioAdministracion.
     *
     */
    public void limpiarCampos() {
        this.campoApellidoPaterno.setText("");
        this.campoApellidoMaterno.setText("");
        this.campoCelular.getCelular().setText("");
        this.campoContraseña.setText("");
        this.campoEmail.getCorreo().setText("");
        this.campoFechaNac.setDate(null);
        this.campoNombre.setText("");
        this.campoRut.getRut().setText("");
        this.campoTelefono.getTelefono().setText("");
        this.campoTipoCuenta.setSelectedIndex(0);
        this.campoUsuario.setText("");
        this.direccion.getBloque().setText("");
        this.direccion.getCalle().setText("");
        this.direccion.getComuna().setSelectedItem("Seleccionar");
        this.direccion.getProvincia().setSelectedItem("Seleccionar");
        this.direccion.getBloque().setText("");
        this.direccion.getDepartamento().setText("");
        direccion.getNumero().setText("");
        this.direccion.getSector().setText("");
        this.direccion.getRegion().setSelectedItem("Seleccionar");
        campoDuracion.setSelectedItem("30");
        this.campoEspecialidad.setSelectedItem("Seleccionar");
        this.campoFonasa.setSelected(false);
        this.campoIsapre.setSelected(false);
        this.campoParticular.setSelected(false);
        this.campoPorcentaje.setText("");
        this.campoArriendo.setText("");
    }

    /**
     * Método que llena todos los campos del diálogo formularioAdministracion a
     * partir de un Usuario entregado.
     *
     * @param variable user de tipo service.Usuario, que contiene el usuario con
     * el que se llenaran los campos
     *
     */
    public void llenarCampos(service.Usuario user) {
        service.UsuarioProfesional uspx = (service.UsuarioProfesional) cargarUsuarioProfesional(user.getRut());
        valorAnterior = "Rut: " + user.getRut() + "\n" + "Nombres: " + user.getNombres() + "\n" + "Apellido Paterno: " + user.getApellidoPaterno() + "\n" + "Apellido Materno: " + user.getApellidoMaterno()
                + "\n" + "Usuario: " + user.getUsuario() + "\n" + "Bloque: " + user.getBloque() + "\n" + "Calle: " + user.getCalle() + "\n" + "Celular: " + user.getCelular() + "\n" + "Comuna: " + user.getComuna() + "\n" + "Departamento: " + user.getDepto() + "\n" + "Email: " + user.getEmail()
                + "\n" + "Fecha nacimiento: " + user.getFechaNac() + "\n" + "Número calle: " + user.getNumero() + "\n" + "Provincia: " + user.getProvincia()
                + "\n" + "Región: " + user.getRegion() + "\n" + "Sector: " + user.getSector() + "\n" + "Teléfono: " + user.getTelefono() + "\n" + "Tipo cuenta: " + user.getTipoCuenta()
                + "\n" + "Arriendo : " + uspx.getArriendo() + "\n" + "Especialidad: " + uspx.getEspecialidad() + "\n" + "Porcentaje: " + uspx.getPorcentaje();
        this.nombreUsuarioAnterior = user.getUsuario();
        try {
            this.campoApellidoPaterno.setText(user.getApellidoPaterno());
            this.campoApellidoMaterno.setText(user.getApellidoMaterno());
            this.campoCelular.getCelular().setText(user.getCelular());
            this.campoContraseña.setText(user.getContrasenia());
            this.campoEmail.getCorreo().setText(user.getEmail());
            this.campoNombre.setText(user.getNombres());
            this.campoRut.getRut().setText(user.getRut());
            this.campoRut.getRut().setEnabled(false);
            this.campoTelefono.getTelefono().setText(user.getTelefono());
            this.campoTipoCuenta.setSelectedItem(user.getTipoCuenta());
            this.campoUsuario.setText(user.getUsuario());
            this.direccion.getBloque().setText(user.getBloque());
            this.direccion.getCalle().setText(user.getCalle());
            this.direccion.getRegion().setSelectedItem(user.getRegion());
            this.direccion.getProvincia().setSelectedItem(user.getProvincia());
            this.direccion.getComuna().setSelectedItem(user.getComuna());
            this.direccion.getDepartamento().setText(user.getDepto());
            direccion.getNumero().setText(user.getNumero());
            this.direccion.getSector().setText(user.getSector());

            if (!user.getFechaNac().equals("dd-MM-yyyy")) {
                this.campoFechaNac.setDate(stringToDate(user.getFechaNac()));
            }

            service.UsuarioProfesional usuarioProfesional = (service.UsuarioProfesional) cargarUsuarioProfesional(user.getRut());
            this.campoFonasa.setSelected(usuarioProfesional.isFonasa());
            this.campoIsapre.setSelected(usuarioProfesional.isIsapre());
            this.campoParticular.setSelected(usuarioProfesional.isParticular());
            this.campoEspecialidad.setSelectedItem(usuarioProfesional.getEspecialidad());
            if (!usuarioProfesional.getArriendo().equals("")) {
                this.radioButomArriendo.setSelected(true);
                this.campoArriendo.setEnabled(true);
                this.campoPorcentaje.setEnabled(false);
            }
            if (!usuarioProfesional.getPorcentaje().equals("")) {
                this.radioButomPorcentaje.setSelected(true);
                this.campoPorcentaje.setEnabled(true);
                this.campoArriendo.setEnabled(false);
            }
            this.campoArriendo.setText(usuarioProfesional.getArriendo());
            this.campoPorcentaje.setText(usuarioProfesional.getPorcentaje());
            GregorianCalendar c = new GregorianCalendar();
            c.setTime(Calendar.getInstance().getTime());
            XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
            service.HorarioProfesional h = (service.HorarioProfesional) cargarHorarioSegunFecha(calendar, user.getRut());
            System.out.println("id: " + h.getId());
            String campo = "";
            if (h.getDuracionBloque() < 10) {
                campo = "0" + h.getDuracionBloque();
            } else {
                campo = "" + h.getDuracionBloque();
            }
            campoDuracion.setSelectedItem(campo);


            estados.clear();
            disponibilidad.clear();
            Gson gson = new Gson();

            if (h.getDisponibilidad() != null) {
                String json = h.getDisponibilidad();
                disponibilidad = gson.fromJson(json, new TypeToken<ArrayList<Point>>() {
                }.getType());// TODO add your handling code here:
                for (Point p : disponibilidad) {
                    estados.put(p, new Color(51, 153, 255));
                }
            }
            campoHoraInicio.setSelectedItem(h.getHoraInicio());
            campoHoraTermino.setSelectedItem(h.getHoraTermino());
            campoMinInicio.setSelectedItem(h.getMinInicio());
            campoMinTermino.setSelectedItem(h.getMinTermino());

        } catch (DatatypeConfigurationException ex) {
            Logger.getLogger(DialogoInfoUsuarioProfesional.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * Método que crea un objeto de tipo Usuario seteando los campos de acuerdo
     * al usuario que se entrega como parametro.
     *
     * @param variable user de tipo service.Usuario que contiene el usuario a
     * modificar.
     * @return devuelve el objeto de tipo service.Usuario con los campos
     * requeridos.
     *
     */
    public service.Usuario crearObjetoUsuario(service.Usuario user) {

        user.setNombres(campoNombre.getText());
        user.setApellidoPaterno(campoApellidoPaterno.getText());
        user.setApellidoMaterno(campoApellidoMaterno.getText());
        user.setBloque(direccion.getBloque().getText());
        user.setCalle(direccion.getCalle().getText());
        user.setCelular(campoCelular.getCelular().getText());
        user.setComuna((String) direccion.getComuna().getSelectedItem());
        user.setDepto(direccion.getDepartamento().getText());
        user.setEmail(campoEmail.getCorreo().getText());
        user.setNumero(direccion.getNumero().getText());
        user.setProvincia((String) direccion.getProvincia().getSelectedItem());
        user.setRut(campoRut.getRut().getText());
        user.setSector(direccion.getSector().getText());
        user.setTelefono(campoTelefono.getTelefono().getText());
        user.setTipoCuenta((String) campoTipoCuenta.getSelectedItem());
        user.setUsuario(campoUsuario.getText());
        user.setActivo(true);
        user.setFechaNac(capturarFechaDeNacimiento());
        user.setRegion((String) direccion.getRegion().getSelectedItem());
        String contraseña = new String(campoContraseña.getPassword());
        if (user.getContrasenia() == null || user.getContrasenia().equals(contraseña) == false) {
            user.setContrasenia(Login.getStringMessageDigest(contraseña));
        }


        return user;


    }

    private UsuarioProfesional crearObjetoUsuarioProfesional(UsuarioProfesional usuarioProfesional) {

        usuarioProfesional.setRut(campoRut.getRut().getText());
        usuarioProfesional.setEspecialidad(campoEspecialidad.getSelectedItem().toString());
        usuarioProfesional.setFonasa(campoFonasa.isSelected());
        usuarioProfesional.setIsapre(campoIsapre.isSelected());
        usuarioProfesional.setParticular(campoParticular.isSelected());
        usuarioProfesional.setArriendo(campoArriendo.getText());
        usuarioProfesional.setPorcentaje(campoPorcentaje.getText());
        return usuarioProfesional;
    }

    /**
     * Método que habilita o deshabilita los campos que se encuentran en el
     * formularioAdministracion, de acuerdo a la opción que tenga como
     * parámetro.
     *
     * @param variable opcion de tipo boolean, cuando es true se habilitan los
     * campos, en caso contrario se deshabilitan.
     *
     */
    public void habilitarCampos(boolean opcion) {

        this.campoApellidoPaterno.setEditable(opcion);
        this.campoApellidoMaterno.setEditable(opcion);
        this.campoCelular.getCelular().setEditable(opcion);
        this.campoContraseña.setEditable(opcion);
        this.campoEmail.getCorreo().setEditable(opcion);
        this.campoFechaNac.setEnabled(opcion);
        this.campoNombre.setEditable(opcion);
        this.campoRut.getRut().setEnabled(opcion);
        this.campoTelefono.getTelefono().setEditable(opcion);
        this.campoTipoCuenta.setEnabled(opcion);
        this.campoUsuario.setEditable(opcion);
        this.direccion.getCalle().setEditable(opcion);
        this.direccion.getComuna().setEnabled(opcion);
        this.direccion.getProvincia().setEnabled(opcion);
        this.direccion.getBloque().setEditable(opcion);
        this.direccion.getDepartamento().setEditable(opcion);
        direccion.getNumero().setEditable(opcion);//getNumerosetEditable(opcion);
        this.direccion.getSector().setEditable(opcion);
        this.direccion.getRegion().setEnabled(opcion);
        this.tablaHorarioDisponible.setEnabled(opcion);
        this.campoDuracion.setEnabled(opcion);
        this.campoEspecialidad.setEnabled(opcion);
        this.campoFonasa.setEnabled(opcion);
        this.campoIsapre.setEnabled(opcion);
        this.campoParticular.setEnabled(opcion);
        this.campoPorcentaje.setEnabled(opcion);
        this.campoArriendo.setEnabled(opcion);
        this.radioButomPorcentaje.setEnabled(opcion);
        this.radioButomArriendo.setEnabled(opcion);
        this.campoHoraInicio.setEnabled(opcion);
        this.campoMinInicio.setEnabled(opcion);
        this.campoHoraTermino.setEnabled(opcion);
        this.campoMinTermino.setEnabled(opcion);
    }

    /**
     * Método que pasa una fecha con el formato de String a Date.
     *
     * @param variable de tipo String llamada strFecha.
     * @return una variable del tipo Date con la fecha convertida a Date.
     *
     */
    public Date stringToDate(String strFecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        Date fecha = null;
        try {
            fecha = formatoDelTexto.parse(strFecha);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;
    }

    /**
     * Método que exporta a PDF la información del usuario que se está
     * visualizando.
     *
     */
    public void exportarPDF() throws DocumentException, FileNotFoundException {
        Document document = new Document();
        String dirArchivo = eligeDireccionArchivo();

        if (!dirArchivo.equals(".pdf")) {
            /*Sección para hacer el pdf, el cuál queda guardado en escritorio con el nombre de Usuario*/

            Font fondoTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD);
            Font fondoSubTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dirArchivo));
            document.open();
            Paragraph p = new Paragraph("Información Usuario", fondoTitulo);
            p.setFirstLineIndent(150);
            document.add(p);

            /*Datos Personales*/
            p = new Paragraph("Datos Personales", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosPersonales = new PdfPTable(2);
            tablaDatosPersonales.addCell("Rut");
            tablaDatosPersonales.addCell(campoRut.getRut().getText());
            tablaDatosPersonales.addCell("Nombres");
            tablaDatosPersonales.addCell(campoNombre.getText());
            tablaDatosPersonales.addCell("Apellido Paterno");
            tablaDatosPersonales.addCell(campoApellidoPaterno.getText());
            tablaDatosPersonales.addCell("Apellido Materno");
            tablaDatosPersonales.addCell(campoApellidoMaterno.getText());
            if (!capturarFechaDeNacimiento().equals("dd-MM-yyyy")) {
                tablaDatosPersonales.addCell("Fecha de Nacimiento");
                tablaDatosPersonales.addCell(capturarFechaDeNacimiento());
            }
            document.add(tablaDatosPersonales);

            /*Datos Dirección*/
            p = new Paragraph("Datos Dirección", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosDir = new PdfPTable(2);
            if (((String) direccion.getRegion().getSelectedItem()).equals("Seleccionar") == false) {
                tablaDatosDir.addCell("Región");
                tablaDatosDir.addCell((String) direccion.getRegion().getSelectedItem());
            }
            if (((String) direccion.getProvincia().getSelectedItem()).equals("Seleccionar") == false) {
                tablaDatosDir.addCell("Provincia");
                tablaDatosDir.addCell((String) direccion.getProvincia().getSelectedItem());
            }
            if (!((String) direccion.getComuna().getSelectedItem() == null)) {
                tablaDatosDir.addCell("Comuna");
                tablaDatosDir.addCell((String) direccion.getComuna().getSelectedItem());
            }
            if (direccion.getSector().getText().equals("") == false) {
                tablaDatosDir.addCell("Sector");
                tablaDatosDir.addCell(direccion.getSector().getText());
            }
            if (direccion.getCalle().getText().equals("") == false) {
                tablaDatosDir.addCell("Calle");
                tablaDatosDir.addCell(direccion.getCalle().getText());
            }
            if (direccion.getNumero().getText().equals("0") == false) {
                tablaDatosDir.addCell("Número");
                tablaDatosDir.addCell(direccion.getNumero().getText());
            }
            if (direccion.getDepartamento().getText().equals("") == false) {
                tablaDatosDir.addCell("Departamento");
                tablaDatosDir.addCell(direccion.getDepartamento().getText());
            }
            if (direccion.getBloque().getText().equals("") == false) {
                tablaDatosDir.addCell("Bloque");
                tablaDatosDir.addCell(direccion.getBloque().getText());
            }
            document.add(tablaDatosDir);

            /*Contacto*/
            p = new Paragraph("Contacto", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaDatosContacto = new PdfPTable(2);
            if (!campoTelefono.getTelefono().getText().equals("")) {
                tablaDatosContacto.addCell("Teléfono");
                tablaDatosContacto.addCell(campoTelefono.getTelefono().getText());
            }
            if (!campoCelular.getCelular().getText().equals("")) {
                tablaDatosContacto.addCell("Celular");
                tablaDatosContacto.addCell(campoCelular.getCelular().getText());
            }
            if (!campoEmail.getCorreo().getText().equals("")) {
                tablaDatosContacto.addCell("E-mail");
                tablaDatosContacto.addCell(campoEmail.getCorreo().getText());
            }
            document.add(tablaDatosContacto);

            /*Información de la Cuenta*/
            p = new Paragraph("Información de la Cuenta", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaInfoUsuario = new PdfPTable(2);
            tablaInfoUsuario.addCell("Tipo de Cuenta");
            tablaInfoUsuario.addCell((String) campoTipoCuenta.getSelectedItem());
            tablaInfoUsuario.addCell("Usuario");
            tablaInfoUsuario.addCell(campoUsuario.getText());
            document.add(tablaInfoUsuario);

            /*Información de la Cuenta*/
            p = new Paragraph("Información del Profesional", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);

            PdfPTable tablaInfoProfesional = new PdfPTable(2);
            tablaInfoProfesional.addCell("Especialidad");
            tablaInfoProfesional.addCell(campoEspecialidad.getSelectedItem().toString());
            tablaInfoProfesional.addCell("Tipo de Atención");
            String tipoAtencion = "";
            if (campoFonasa.isSelected()) {
                tipoAtencion = tipoAtencion + "FONASA, ";
            }
            if (campoFonasa.isSelected()) {
                tipoAtencion = tipoAtencion + "ISAPRE, ";
            }
            if (campoFonasa.isSelected()) {
                tipoAtencion = tipoAtencion + "PARTICULAR, ";
            }
            tablaInfoProfesional.addCell(tipoAtencion);

            tablaInfoProfesional.addCell("Tipo de Convenio");
            if (radioButomPorcentaje.isSelected()) {
                tablaInfoProfesional.addCell("Porcentaje =" + campoPorcentaje.getText() + " %");
            } else {
                tablaInfoProfesional.addCell("Arriendo = $ " + campoArriendo.getText());
            }

            document.add(tablaInfoProfesional);


            //Imprime los datos Correspondiente a la Tabla de Disponibilidad
            p = new Paragraph("Horarios Disponibles", fondoSubTitulo);
            p.setSpacingAfter(10);
            p.setSpacingBefore(10);
            document.add(p);
            p = new Paragraph("Duración de Bloques: " + campoDuracion.getSelectedItem().toString() + " minutos");
            document.add(p);
            p = new Paragraph("Hora de Inicio: " + campoHoraInicio.getSelectedItem().toString() + " : " + campoMinInicio.getSelectedItem().toString() + "     "
                    + "Hora de Término: " + campoHoraTermino.getSelectedItem().toString() + " : " + campoMinTermino.getSelectedItem().toString());
            p.setSpacingAfter(10);
            document.add(p);

            document.add(imprimirTablaDisponibilidadEnPDF());
            document.close();
            abrirArchivo(dirArchivo);
        }
    }

    /**
     * Método que exporta a PDF la información la tabla de horarios disponibles.
     * Esta se escribe en el documento PDF en donde se encuentra toda la
     * información del Usuario.
     *
     * @return una variable de tipo PdfPTable que contiene la información de la
     * tabla para escribirla en pdf.
     *
     */
    public PdfPTable imprimirTablaDisponibilidadEnPDF() {
        //Color color = new Color(240, 240, 240);
        PdfPCell celda2 = new PdfPCell(new Paragraph("Hora"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        PdfPTable Tdisponibilidad = new PdfPTable(8);
        Tdisponibilidad.setWidthPercentage(85);
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Lunes"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Martes"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Miércoles"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));

        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Jueves"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Viernes"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Sábado"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);
        celda2 = new PdfPCell(new Paragraph("Domingo"));
        celda2.setBackgroundColor(new BaseColor(240, 240, 240));
        Tdisponibilidad.addCell(celda2);

        PdfPCell celda = new PdfPCell();

        celda.setBackgroundColor(new BaseColor(51, 153, 255));
        for (int i = 0; i < this.tablaHorarioDisponible.getRowCount(); i++) {
            Tdisponibilidad.addCell((String) this.tablaHorarioDisponible.getValueAt(i, 0));
            for (int j = 1; j < this.tablaHorarioDisponible.getColumnCount(); j++) {

                if (this.estados.get(new Point(i, j)) != null && this.estados.get(new Point(i, j)) != Color.white) {

                    Tdisponibilidad.addCell(celda);
                } else {
                    Tdisponibilidad.addCell("");
                }
            }
        }
        return Tdisponibilidad;
    }

    /**
     * Método en el cual se elige el directorio para exportar a PDF, con
     * jfileChooser.
     *
     * @return una variable de tipo String que contiene la dirección en donde se
     * almacenará el PDF.
     *
     */
    public String eligeDireccionArchivo() {
        String dirArchivo = "";
        JFileChooser jFileChooser1 = new JFileChooser();
        jFileChooser1.setDialogTitle("Guardar archivo:");
        jFileChooser1.setVisible(true);

        int r = jFileChooser1.showSaveDialog(null);
        if (r == JFileChooser.APPROVE_OPTION) {
            File file = jFileChooser1.getSelectedFile();
            dirArchivo = String.valueOf(file);
        }
        dirArchivo = dirArchivo.replace('\\', '/') + ".pdf";
        return dirArchivo;

    }

    /**
     * Método que abre el PDF de acuerdo a la dirección especificada.
     *
     * @param variable de tipo String que contiene la dirección necesaria para
     * abrir el documento.
     *
     */
    public void abrirArchivo(String direccion) {
        //Abre el documento pdf
        try {
            File file = new File(direccion);
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Método captura la fecha de naciemiento del Usuario.
     *
     * @return una variable de tipo String que contiene la fecha de Nacimiento.
     *
     */
    public String capturarFechaDeNacimiento() {
        Calendar cal = Calendar.getInstance();
        String fecha = "dd-MM-yyyy";
        if (this.campoFechaNac.getDate() != null) {
            cal.setTime(this.campoFechaNac.getDate());
            //Dia - mes - año
            fecha = Integer.toString(cal.get(Calendar.DAY_OF_MONTH)) + "-"
                    + Integer.toString(cal.get(Calendar.MONTH) + 1) + "-"
                    + Integer.toString(cal.get(Calendar.YEAR));
        }
        return fecha;

    }

    /**
     * Método que valida los campos que se han ingresadoen el
     * formularioAdministracion, emitiendo un mensaje de advertencia en caso de
     * ser necesario. Estos campos son telefono, email, celular, usuario,
     * nombre, apellido paterno, apellido materno, contraseña y rut.
     *
     * @return una variable de tipo boolean. Cuando es true, significa que son
     * validos los campos.
     *
     */
    public boolean validarCampos() {
        boolean hayContacto = false;
        boolean hayTipoAtencion = false;
        boolean hayTipoConvenio = false;

        if (!campoTelefono.getTelefono().getText().equals("")
                || !campoEmail.getCorreo().getText().equals("")
                || !campoCelular.getCelular().getText().equals("")) {
            hayContacto = true;
        }
        if (campoFonasa.isSelected() || campoIsapre.isSelected() || campoParticular.isSelected()) {
            hayTipoAtencion = true;
        }

        if (!campoPorcentaje.getText().equals("") || !campoArriendo.equals("")) {
            hayTipoConvenio = true;
        }


        String contraseña = new String(campoContraseña.getPassword());



        if (hayContacto && hayTipoAtencion && hayTipoConvenio
                && !contraseña.equals("") && !campoEspecialidad.getSelectedItem().equals("Seleccionar")
                && !campoUsuario.getText().equals("")
                && !campoNombre.getText().equals("")
                && !campoApellidoPaterno.getText().equals("") && !campoApellidoMaterno.getText().equals("")) {
            cambiarEtiquetaMensajeria("Área de mensajería", Color.black);

            return true;
        }
        cambiarEtiquetaMensajeria(Mensajeria.mensajeCamposObligatorios(), Color.red);

        return false;
    }

    /**
     * Método que retorna los horarios disponibles del usuario.
     *
     * @return variable de tipo ArrayList<Point> que contiene los puntos de los
     * horarios disponibles que estan seleccionados en la tabla.
     *
     */
    public ArrayList<Point> getDisponibilidad() {
        return disponibilidad;
    }

    /**
     * Método que retorna los estados de las celdas que fueron seleccionadas en
     * la tabla de horarios disponibles del usuario.
     *
     * @return variable de tipo HashMap<Point, Color> que contiene los puntos de
     * los horarios disponibles que estan en la tabla y el color white o azul si
     * es que fueron seleccionadas o no.
     *
     */
    public HashMap<Point, Color> getEstados() {
        return estados;
    }

    /**
     * Método que retorna el label en donde se dan a conocer los mensajes de
     * advertencia.
     *
     * @return variable de tipo JLabel.
     *
     */
    public JLabel getMensajesAdvertencia() {
        return mensajesAdvertencia;
    }

    /**
     * Método que cambia el mensaje del diálogo de acuerdo a lo que se requiera.
     *
     * @param variable de tipo String con el mensaje
     * @param variable de tipo Color con el color del mensaje
     *
     */
    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        this.mensajesAdvertencia.setText(mensaje);
        this.mensajesAdvertencia.setForeground(color);

    }

    /**
     * Aqui comienzan los métodos correspondientes a los servicios
     *
     */
    /**
     * Método que retorna la lista de Usuarios que son Profesionales y que estan
     * en la Base de Datos, a través del servicio listarUsuarioProfesional.
     *
     * @return variable de tipo java.util.List<service.UsuarioProfesional> que
     * contiene la lista de usuarios que son Profesionales.
     *
     */
    private static java.util.List<service.UsuarioProfesional> listarUsuarioProfesional() {
        service.UsuarioProfesionalWSService service = new service.UsuarioProfesionalWSService();
        service.UsuarioProfesionalWS port = service.getUsuarioProfesionalWSPort();
        return port.listarUsuarioProfesional();
    }

    /**
     * Método que modifica el usuario Profesional que esta registrado en la Base
     * de Datos, a través del servicio modificarUsuarioProfesional.
     *
     * @param variable de tipo service.UsuarioProfesional llamada arg0 que es el
     * usuario a modificar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) la actualización del usuario.
     *
     */
    private static boolean modificarUsuarioProfesional(service.UsuarioProfesional usuarioProfesional) {
        service.UsuarioProfesionalWSService service = new service.UsuarioProfesionalWSService();
        service.UsuarioProfesionalWS port = service.getUsuarioProfesionalWSPort();
        return port.modificarUsuarioProfesional(usuarioProfesional);
    }

    /**
     * Método que registra el usuario Profesional en la Base de Datos, a través
     * del servicio agregarUsuarioProfesional.
     *
     * @param variable de tipo service.UsuarioProfesional llamada arg0 que es el
     * usuario a registrar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) el regitro del usuario.
     *
     */
    private static boolean agregarUsuarioProfesional(service.UsuarioProfesional arg0) {
        service.UsuarioProfesionalWSService service = new service.UsuarioProfesionalWSService();
        service.UsuarioProfesionalWS port = service.getUsuarioProfesionalWSPort();
        return port.agregarUsuarioProfesional(arg0);
    }

    /**
     * Método que carga el usuario Profesional de la Base de Datos, a partir de
     * un rut y a través del servicio cargarUsuarioProfesional.
     *
     * @param variable de tipo String correspondiente al rut usuario profesional
     * a cargar.
     * @return variable de tipo Object que corresponde al Usuario cargado.
     *
     */
    private static Object cargarUsuarioProfesional(java.lang.String rut) {
        service.UsuarioProfesionalWSService service = new service.UsuarioProfesionalWSService();
        service.UsuarioProfesionalWS port = service.getUsuarioProfesionalWSPort();
        return port.cargarUsuarioProfesional(rut);
    }

    /**
     * Método que carga el usuario Profesional de la Base de Datos, a partir de
     * un rut y a través del servicio cargarUsuarioProfesional.
     *
     * @param variable de tipo String correspondiente al rut usuario profesional
     * a cargar.
     * @return variable de tipo Object que corresponde al Usuario cargado.
     *
     */
    private static Object cargarUsuario(java.lang.String rut) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.cargarUsuario(rut);
    }

    /**
     * Método que modifica el usuario que esta registrado en la Base de Datos, a
     * través del servicio modificarUsuario.
     *
     * @param variable de tipo service.Usuario llamada arg0 que es el usuario a
     * modificar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) la actualización del usuario.
     *
     */
    private static boolean modificarUsuario(service.Usuario arg0) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.modificarUsuario(arg0);
    }

    /**
     * Método que registra el usuario en la Base de Datos, a través del servicio
     * agregarUsuario.
     *
     * @param variable de tipo service.Usuario llamada arg0 que es el usuario a
     * registrar.
     * @return variable de tipo boolean que indica si se realizó (true) o no
     * (false) el regitro del usuario.
     *
     */
    private static boolean agregarUsuario(service.Usuario arg0) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.agregarUsuario(arg0);
    }

    /**
     * Método registra en la bitácora la acción realizada en el sistema
     *
     */
    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    /**
     * Método que retorna la lista de Usuarios que estan en la Base de Datos, a
     * través del servicio listarUsuarios.
     *
     * @return variable de tipo java.util.List<service.Usuario> que contiene la
     * lista de usuarios.
     *
     */
    private static java.util.List<service.Usuario> listarUsuarios() {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.listarUsuarios();
    }

    /**
     * Clase utilizada para pintar las celdas de la tabla de disponibilidad de
     * usuario
     *
     */
    class ColoredTableCellRenderer extends DefaultTableCellRenderer {

        private ColoredTableCellRenderer() {
            super();

        }

        public Component getTableCellRendererComponent(JTable table, Object value, boolean selected, boolean focused, int row, int column) {
            super.getTableCellRendererComponent(table, value, selected, focused, row, column);

            setEnabled(table == null || table.isEnabled()); // see question above
//        System.out.println("row: "+ row +" column: "+column);
            Color c = estados.get(new Point(row, column));
            if (c != null) {
                setBackground(c);
            } else {
                setBackground(null);
            }

            return this;
        }
    }

    private static boolean agregarPrivilegios(service.Privilegios privilegios) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.agregarPrivilegios(privilegios);
    }

    private static boolean agregarHorario(service.HorarioProfesional horario) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.agregarHorario(horario);
    }

    private static boolean modificarHorario(service.HorarioProfesional arg0) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.modificarHorario(arg0);
    }

    private static Object cargarHorarioSegunFecha(javax.xml.datatype.XMLGregorianCalendar fecha, java.lang.String rut) {
        service.AgendaWS_Service service = new service.AgendaWS_Service();
        service.AgendaWS port = service.getAgendaWSPort();
        return port.cargarHorarioSegunFecha(fecha, rut);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }
}
